package sort;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author leecho
 * @Date: 2021/10/20 10:24
 * @Version 1.0
 */

public class MergeSort {
    public static void main(String[] args) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        System.out.println(df.format(new Date()));

//        int[] arr = {8,4,5,7,1,3,6,2};

        MergeSort mergeSort = new MergeSort();

        int[] arr = new int[80000];
        for (int i = 0; i < 80000; i++) {
            arr[i] = (int) (Math.random()*800000);
        }

        int[] temp = new int[arr.length];
        mergeSort.mergeSort(arr,0, arr.length-1,temp);

        System.out.println(df.format(new Date()));
//        System.out.println(Arrays.toString(arr));

    }

    /*
    * 思路
    * - 先将数组以中间进行递归分割
    * - 将分割后的数组进行排序比较
    * - 将排序后的数组存入临时数组
    *   - 双指向比较，小的先入，当一边存入完毕后，把另一边的所有剩下的存入临时数组
    * - 将临时数组复制给原数组
    * */
    public void mergeSort(int[] arr, int left, int right, int[] temp){
        /*
        * 思路
        * - 这里进行递归分割*/
        if (left < right){
            int mid = (left+right) / 2;
            mergeSort(arr,left,mid,temp);
            mergeSort(arr,mid+1,right,temp);
            merge(arr,left,mid,right,temp);
        }
    }

    /*
    * 思路
    *- 这里要传入原数组和数组的左、中、有和一个临时数组进行分割的效果
    *- 传入的数组进行两边的指针比较，分别存入临时数组
    *   - 谁先存入完毕，将另一边的剩下的所有的存入临时数组
    * - 最后进行临时数组的复制给原数组
    * */
    public void merge(int[] arr, int left, int mid, int right, int[] temp){
        int i = left;
        int j = mid + 1;
        int t = 0;

        while (i <= mid && j <= right){
            if (arr[i] < arr[j]){
                temp[t] = arr[i];
                t++;
                i++;
            } else {
                temp[t] = arr[j];
                t++;
                j++;
            }
        }

        while (i <= mid){
            temp[t] = arr[i];
            t++;
            i++;
        }

        while (j <= right){
            temp[t] = arr[j];
            t++;
            j++;
        }

        t = 0;
        int tempLeft = left;
        while (tempLeft <= right){
            arr[tempLeft] = temp[t];
            t++;
            tempLeft++;
        }
    }
}